class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null) {
            return false;  // 链表为空，不可能有环
        }

        ListNode slow = head;  // 慢指针
        ListNode fast = head;  // 快指针

        while (fast != null && fast.next != null) {
            slow = slow.next;  // 慢指针移动一步
            fast = fast.next.next;  // 快指针移动两步

            if (slow == fast) {
                return true;  // 快慢指针相遇，说明链表有环
            }
        }

        return false;  // 如果快指针走到链表末尾，没有相遇，说明没有环
    }
}
